/**
 * 用户角色关联数据访问层接口
 * 
 * 功能说明：
 * - 提供用户角色关联关系的数据库操作接口
 * - 管理用户与角色之间的多对多关联关系
 * - 提供基于用户ID的角色查询和批量删除功能
 * 
 * 查询方法说明：
 * - findByUserId：根据用户ID查询用户的所有角色关联记录
 * - findRoleNamesByUserId：根据用户ID查询用户的所有角色名称列表
 * - deleteByUserId：根据用户ID删除该用户的所有角色关联记录
 * 
 * 设计原则：
 * - 使用JPQL自定义查询，提高查询效率和灵活性
 * - 提供批量删除方法，支持用户角色重置等场景
 * - 查询结果返回List类型，支持用户拥有多个角色
 * 
 * 使用场景：
 * - 权限查询：获取用户拥有的所有角色信息
 * - 权限验证：获取用户角色名称列表进行权限判断
 * - 角色管理：为用户分配或移除角色时操作关联表
 * - 用户删除：删除用户时同时删除其角色关联记录
 * 
 * @author eCommerce Team
 * @version 1.0
 */
package com.ecommerce.auth.repository;

import com.ecommerce.auth.entity.UserRole;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 用户角色关联数据访问层接口
 * 管理用户与角色的关联关系，提供角色查询和批量操作功能
 */
@Repository
public interface UserRoleRepository extends JpaRepository<UserRole, Long> {

    /**
     * 根据用户ID查询用户的所有角色关联记录
     * 
     * @param userId 用户ID
     * @return 用户角色关联记录列表，如果没有角色则返回空列表
     */
    List<UserRole> findByUserId(Long userId);

    /**
     * 根据用户ID查询用户的所有角色名称列表
     * 
     * 使用JPQL查询，直接获取角色名称，避免加载完整的角色对象，提高性能
     * 
     * @param userId 用户ID
     * @return 角色名称列表，如果没有角色则返回空列表
     */
    @Query("SELECT ur.role.name FROM UserRole ur WHERE ur.user.id = :userId")
    List<String> findRoleNamesByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID删除该用户的所有角色关联记录
     * 
     * 用于用户角色重置、用户删除等场景，批量删除用户的所有角色关联
     * 
     * @param userId 用户ID
     */
    void deleteByUserId(Long userId);
}